home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xform.c < prev    next >
C/C++ Source or Header  |  1995-05-15  |  34KB  |  1,113 lines

  1. /** 
  2.  * 
  3.  * xform.c - (c) 1994 Copyright by John R. Punin
  4.  *
  5.  * ASHE
  6.  *
  7.  * This file has the routines to create the Form option menu.
  8.  * 
  9.  * John R. Punin      Jul - 24 - 1994
  10.  *
  11. */
  12. #include "xhtml.h"
  13. #include "xform.h"
  14. #include "xheader.h"
  15. #include "xfile.h"
  16.  
  17. static int ntype=0;
  18. static int check=0;
  19. static int multi=0;
  20. static int selec=0;
  21.  
  22. MenuItem type_menu[] = {
  23. { "Text...", &xmPushButtonWidgetClass, 'T', NULL,NULL, form_text, 0, NULL},
  24. { "Hidden...", &xmPushButtonWidgetClass, 'H', NULL, NULL,form_text, 0, NULL},
  25. { "Password...", &xmPushButtonWidgetClass, 'P', NULL,NULL, form_text, 0, NULL},
  26. { "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL},
  27. { "Checkbox...", &xmPushButtonWidgetClass, 'C', NULL, NULL, form_radio, 0, NULL},
  28. { "Radio...", &xmPushButtonWidgetClass, 'a', NULL,NULL, form_radio, 0, NULL},
  29. { "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL},
  30. { "Reset...", &xmPushButtonWidgetClass, 'R', NULL,NULL, form_reset, 0, NULL},
  31. { "Submit...", &xmPushButtonWidgetClass, 'S', NULL,NULL, form_reset, 0, NULL},
  32. NULL,
  33. };
  34.  
  35. MenuItem form_menu[] = {
  36. { "Form...", &xmPushButtonWidgetClass, 'F', NULL,NULL, set_form, 0, NULL},
  37. { "Input", &xmCascadeButtonWidgetClass, 'I', NULL, NULL, 0, 0, type_menu},
  38. { "Select...", &xmPushButtonWidgetClass, 'S', NULL, NULL, form_select, 0, NULL},
  39. { "Option...", &xmPushButtonWidgetClass, 'O', NULL,NULL , form_option, 0, NULL},
  40. { "Textarea...", &xmPushButtonWidgetClass, 'T', NULL,NULL,form_textarea,0,NULL},
  41. NULL,};
  42.  
  43. Widget 
  44. BuildPulldownMenu(Widget w, char *menu_title, char menu_mnemonic,
  45.          Boolean tear_off, MenuItem *items,HTMLED *he)
  46. {
  47.    Widget PullDown, cascade, widget;
  48.    int i;
  49.    XmString str;
  50.    
  51.    PullDown = XmCreatePulldownMenu(w,"pulldown", NULL,0);
  52.    if (tear_off)
  53.       XtVaSetValues(PullDown, XmNtearOffModel, XmTEAR_OFF_ENABLED, NULL);
  54.    str = XmStringCreateLocalized(menu_title);
  55.    cascade = XtVaCreateManagedWidget
  56.       (menu_title,xmCascadeButtonWidgetClass, w,
  57.        XmNsubMenuId, PullDown,
  58.        XmNlabelString,str,
  59.        XmNmnemonic, menu_mnemonic,
  60.        NULL);
  61.    XmStringFree(str);
  62.    
  63.    /* Now add the menu items */
  64.    
  65.    for(i=0; items[i].label != NULL; i++)
  66.    {
  67.       /* If subitems exists, create the pull-right menu by calling this
  68.      function recursively. Since the function returns a cascade button
  69.      the widget returned is used..
  70.        */
  71.       if(items[i].subitems)
  72.      widget = BuildPulldownMenu(PullDown, items[i].label,
  73.                     items[i].mnemonic, tear_off,
  74.                     items[i].subitems,he);
  75.       else
  76.      widget = XtVaCreateManagedWidget(items[i].label, *items[i].class,
  77.                       PullDown,NULL);
  78.       /* Whether the item is a real item or a cascade button with a menu
  79.      it can still have a mnemonic.
  80.        */
  81.       if(items[i].mnemonic)
  82.      XtVaSetValues(widget,XmNmnemonic, items[i].mnemonic,NULL);
  83.       /* any item can have an accelerator, except  cascade menus. But,
  84.      I don't worry about that */
  85.       if(items[i].accelerator)
  86.       {
  87.      str = XmStringCreateLocalized (items[i].accel_text);
  88.      XtVaSetValues(widget, XmNaccelerator,items[i].accelerator,
  89.                XmNacceleratorText, str, NULL);
  90.      XmStringFree(str);
  91.       }
  92.       else if(items[i].accel_text)
  93.       {
  94.      str = XmStringCreateLocalized (items[i].accel_text);
  95.      XtVaSetValues(widget,
  96.                XmNacceleratorText, str, NULL);
  97.      XmStringFree(str);
  98.       }
  99.       
  100.       items[i].callback_data = (XtPointer)he;
  101.       if(items[i].callback)
  102.      XtAddCallback(widget, 
  103.                (items[i].class == &xmToggleButtonWidgetClass) ?
  104.                XmNvalueChangedCallback : /*Toggle Button class */
  105.             XmNactivateCallback, /*PushButton class */
  106.             items[i].callback, items[i].callback_data);
  107.    }
  108.    return cascade;
  109. }
  110.                
  111.                      
  112. void
  113. set_form(Widget w, XtPointer client_data, XtPointer call_data)
  114. {
  115.    HTMLED *he = (HTMLED *)client_data;
  116.    Widget dialog,optionmenu,label_form,name_box;
  117.  
  118.    XmString label = 
  119.       XmStringCreateLtoR("FORM \n",XmSTRING_DEFAULT_CHARSET);
  120.    XmString t = 
  121.       XmStringCreateLtoR("Action (URL) : \n",XmSTRING_DEFAULT_CHARSET);
  122.    XmString clear =XmStringCreateSimple("Clear");
  123.  
  124.    XmString method = XmStringCreateSimple("Method :");
  125.    XmString get =XmStringCreateSimple("Get");
  126.    XmString post =XmStringCreateSimple("Post");
  127.    XmString none =XmStringCreateSimple("None");
  128.  
  129.    dialog = XmCreatePromptDialog(he->textarea,"Form_html",NULL,0);
  130.    XtVaSetValues(dialog, 
  131.          XmNselectionLabelString,t,
  132.          XmNapplyLabelString,clear,NULL);
  133.    XmStringFree(clear);   XmStringFree(t);
  134.    
  135.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  136.    
  137.    optionmenu = XmVaCreateSimpleOptionMenu(name_box,"option_menu",
  138.             method,'\0',0 /* initial menu selection */,option_cb,
  139.         XmVaPUSHBUTTON,get,'\0',NULL,NULL,
  140.         XmVaPUSHBUTTON,post,'\0',NULL,NULL,
  141.         XmVaPUSHBUTTON,none,'\0',NULL,NULL,
  142.             XmNuserData,he,
  143.         NULL);
  144.    XmStringFree(get);   XmStringFree(post);   
  145.    XmStringFree(none);XmStringFree(method);
  146.  
  147.  
  148.  
  149.    label_form = XmCreateLabel(name_box,"label_form",NULL,0);
  150.    XtVaSetValues(label_form,XmNlabelString,label,NULL);
  151.    XmStringFree(label);
  152.  
  153.    XtVaSetValues(optionmenu, XmNtopAttachment, XmATTACH_WIDGET, 
  154.          XmNtopWidget,label_form,
  155.          XmNleftAttachment, XmATTACH_FORM,
  156.          NULL); 
  157.    XtVaSetValues(label_form, XmNtopAttachment, XmATTACH_FORM, 
  158.          XmNleftAttachment, XmATTACH_FORM,
  159.          NULL); 
  160.  
  161.    XtManageChild(optionmenu);
  162.    XtManageChild(label_form);
  163.    XtManageChild(name_box);
  164.    
  165.  
  166.    /* When the user types the Reference name, call form_name()... */
  167.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)form_name,(XtPointer)he);
  168.    
  169.    /* If the user selects cancel, just detroy the dialog */
  170.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); 
  171.    
  172.    /* Clear button is available */
  173.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  174.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  175.    
  176.    /* No help is available */
  177.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  178.    
  179.    XtManageChild(dialog);
  180.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  181.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  182.         0,0,800,800,0,0);
  183. }
  184.  
  185. void
  186. form_name(Widget w, XtPointer client_data, XtPointer call_data)
  187. {
  188.    XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
  189.    HTMLED *he = (HTMLED *)client_data;
  190.    XmTextPosition left=0,right=0;
  191.    int len,lsel = 0;
  192.    char *str,*str2, *value,*ssel = NULL;
  193.  
  194.    he->last_command = FORM;
  195.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  196.    {
  197.       if(right<=left)
  198.      left = right = XmTextGetInsertionPosition(he->textarea);
  199.    }
  200.    else
  201.       left = right = XmTextGetInsertionPosition(he->textarea);
  202.  
  203.    if(left!=right)
  204.    {
  205.       ssel = XmTextGetSelection(he->textarea);
  206.       lsel = strlen(ssel);
  207.    }
  208.  
  209.    if(cbs->value!=NULL)
  210.    {
  211.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
  212.       len = strlen(value);
  213.       str = XtMalloc(len+40);
  214.    }
  215.    str2 = XtMalloc(20);
  216.    if(he->method == GET)
  217.       strcpy(str2," METHOD=\"GET\"");
  218.    else if(he->method == POST)
  219.       strcpy(str2," METHOD=\"POST\"");
  220.    else
  221.    {
  222.       XtFree(str2);
  223.       str2=NULL;
  224.    }
  225.  
  226.    if(left!=right)
  227.    {
  228.       XmTextInsert(he->textarea,right,"\n</FORM>");
  229.       if(str2)
  230.      sprintf(str,"\n<FORM ACTION=\"%s\" %s>\n ",value,str2);
  231.       else
  232.      sprintf(str,"\n<FORM ACTION=\"%s\">\n",value);
  233.  
  234.       XmTextInsert(he->textarea,left,str);
  235.       XmTextSetInsertionPosition(he->textarea,left+strlen(str));
  236.       XtFree(str); 
  237.    }
  238.    else
  239.    {
  240.       XtFree(str);
  241.       str = XtMalloc(50);
  242.       sprintf(str,"\n<FORM ACTION=\"%s\" ",value);
  243.       if(str2)
  244.      strcat(str,str2);
  245.       strcat(str,">\n\n</FORM>");
  246.       XmTextInsert(he->textarea,left,str);
  247.       XtFree(str); XtFree(str2);
  248.       XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 8);
  249.    }
  250.    XtFree(ssel);
  251.    he->method = GET;
  252.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  253. }
  254.  
  255. void
  256. option_cb(Widget w, XtPointer client_data, XtPointer call_data)
  257. {
  258.    Widget parent = XtParent(w);
  259.    HTMLED *he;
  260.    int item_no = (int)client_data;
  261.  
  262.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  263.    he->method = item_no;
  264. }
  265.  
  266. void
  267. form_text(Widget w, XtPointer client_data, XtPointer call_data)
  268. {
  269.    HTMLED *he = (HTMLED *)client_data;
  270.    
  271.    Widget dialog,name_box,text_name,label_name;
  272.    Widget label_maxl,text_maxl,label_size,text_size,label_input;
  273.  
  274.    XmString va = XmStringCreateSimple("Value :");
  275.    XmString na = XmStringCreateSimple("Name :");
  276.    XmString ml = XmStringCreateSimple("MaxLength :");
  277.    XmString si = XmStringCreateSimple("Size :        ");
  278.  
  279.    XmString label = get_label_input(w);
  280.    XmString clear = XmStringCreateSimple("Clear");
  281.  
  282.    dialog = XmCreatePromptDialog(he->textarea,"Input_text",NULL,0);
  283.  
  284.    XtVaSetValues(dialog,XmNselectionLabelString,va,
  285.          XmNapplyLabelString,clear,NULL);
  286.    XmStringFree(va);XmStringFree(clear);
  287.  
  288.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  289.    
  290.    label_name = XmCreateLabel(name_box,"label_name",NULL,0);
  291.    XtVaSetValues(label_name,XmNlabelString,na,NULL);
  292.    XmStringFree(na);   
  293.  
  294.    text_name = XmCreateText(name_box,"text_name",NULL,0);
  295.  
  296.    label_size = XmCreateLabel(name_box,"label_size",NULL,0);
  297.    XtVaSetValues(label_size,XmNlabelString,si,NULL);
  298.    XmStringFree(si);
  299.  
  300.    text_size = XmCreateText(name_box,"text_size",NULL,0);
  301.  
  302.    label_maxl = XmCreateLabel(name_box,"label_maxl",NULL,0);
  303.    XtVaSetValues(label_maxl,XmNlabelString,ml,NULL);
  304.    XmStringFree(ml);
  305.  
  306.    text_maxl = XmCreateText(name_box,"text_maxl",NULL,0);
  307.  
  308.    label_input = XmCreateLabel(name_box,"label_input",NULL,0);
  309.    XtVaSetValues(label_input,XmNlabelString,label,NULL);
  310.    XmStringFree(label);
  311.  
  312.  
  313.    XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET, 
  314.          XmNtopWidget, label_name,
  315.          XmNleftAttachment, XmATTACH_FORM, 
  316.          XmNcolumns,26,
  317.          NULL);
  318.    XtManageChild(text_name);
  319.    
  320.    XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET, 
  321.          XmNtopWidget, text_size,
  322.          XmNleftAttachment, XmATTACH_FORM, 
  323.          NULL); 
  324.    XtManageChild(label_name);
  325.    XtVaSetValues(text_size, XmNtopAttachment, XmATTACH_WIDGET, 
  326.          XmNtopWidget,label_size,
  327.          XmNleftAttachment, XmATTACH_FORM, 
  328.          XmNcolumns,12,
  329.          NULL);
  330.  
  331.    XtVaSetValues(label_size, XmNtopAttachment, XmATTACH_WIDGET, 
  332.          XmNtopWidget,label_input,
  333.          XmNleftAttachment, XmATTACH_FORM,
  334.          NULL); 
  335.    XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM, 
  336.          XmNleftAttachment, XmATTACH_FORM,
  337.          NULL); 
  338.  
  339.    XtVaSetValues(text_maxl, XmNtopAttachment, XmATTACH_WIDGET, 
  340.          XmNtopWidget,label_maxl,
  341.          XmNleftAttachment, XmATTACH_WIDGET, 
  342.          XmNleftWidget, text_size,
  343.          XmNcolumns,12,
  344.          NULL);
  345.  
  346.    XtVaSetValues(label_maxl, XmNtopAttachment, XmATTACH_WIDGET,
  347.          XmNtopWidget,label_input,
  348.          XmNleftAttachment, XmATTACH_WIDGET,
  349.          XmNleftWidget, label_size,
  350.          NULL);
  351.  
  352.    XtManageChild(text_size);
  353.    XtManageChild(label_size); 
  354.    XtManageChild(text_maxl);
  355.    XtManageChild(label_maxl);
  356.    XtManageChild(label_input);
  357.  
  358.    XtManageChild(name_box);
  359.   
  360.   /* When the user types the Value, call ok_input_text()... */
  361.   XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
  362.    
  363.    /* If the user selects cancel, just detroy the dialog */
  364.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  365.  
  366.    /* Clear button is available */
  367.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  368.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  369.  
  370.    /* No help is available */
  371.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  372.  
  373.    /* verify if these fields are numbers */   
  374.    XtAddCallback(text_size,XmNmodifyVerifyCallback,
  375.          (XtCallbackProc)check_number, (XtPointer)5);
  376.    XtAddCallback(text_maxl,XmNmodifyVerifyCallback,
  377.          (XtCallbackProc)check_number, (XtPointer)5);
  378.  
  379.    XtManageChild(dialog);
  380.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  381.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  382.                    0,0,800,800,0,0);
  383.  
  384. }
  385.  
  386. void
  387. ok_input_text(Widget w, XtPointer client_data, XtPointer call_data)
  388. {
  389.    HTMLED *he = (HTMLED *)client_data;
  390.    XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
  391.    Widget dialog,name_box,text_size,text_name,text_maxl;
  392.    char *size,*name,*maxl,*value;
  393.    int lsize, lname,lmaxl;
  394.    int lvalue=0;
  395.  
  396.    XmTextPosition left = XmTextGetInsertionPosition(he->textarea);
  397.    char *inputcom = NULL;   
  398.  
  399.    dialog = XtNameToWidget(XtParent(w),"Input_text");
  400.    if(!dialog) dialog = XtNameToWidget(XtParent(w),"Input_check");
  401.    name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
  402.    text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL);
  403.    text_name = (name_box ? XtNameToWidget(name_box,"text_name") : NULL);
  404.    text_maxl = (name_box ? XtNameToWidget(name_box,"text_maxl") : NULL);
  405.    size = (text_size ? XmTextGetString(text_size) : NULL);
  406.    name = (text_name ? XmTextGetString(text_name) : NULL);
  407.    maxl = (text_maxl ? XmTextGetString(text_maxl) : NULL);
  408.    value=NULL;
  409.    lsize = (size ? strlen(size) : 0);
  410.    lname = (name ? strlen(name): 0);
  411.    lmaxl= (maxl ? strlen(maxl): 0);
  412.  
  413.    if(cbs->value)
  414.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
  415.  
  416.    lvalue = (value ? strlen(value): 0);
  417.  
  418.    inputcom=XtMalloc(lsize+lname+lmaxl+lvalue+80);
  419.  
  420.    he->last_command = INPUT;
  421.  
  422.    sprintf(inputcom,"<INPUT type=\"%s",type_menu[ntype].label);
  423.    inputcom[13]=inputcom[13]+32; /* convert to lower case */
  424.    inputcom[strlen(inputcom)-3]='\0';
  425.    strcat(inputcom,"\" ");
  426.    ntype = 0;
  427.    if(lname!=0)
  428.    {
  429.       strcat(inputcom," name=\"");
  430.       strcat(inputcom,name);
  431.       strcat(inputcom,"\"");
  432.    }
  433.    if(lvalue!=0)
  434.    {
  435.       strcat(inputcom," value=\"");
  436.       strcat(inputcom,value);
  437.       strcat(inputcom,"\"");
  438.    }
  439.    
  440.    if(lsize!=0)
  441.    {
  442.       strcat(inputcom," size=");
  443.       strcat(inputcom,size);
  444.    }
  445.    if(lmaxl!=0)
  446.    {
  447.       strcat(inputcom," maxlength=");
  448.       strcat(inputcom,maxl);
  449.    }
  450.    if(check!=0)
  451.       strcat(inputcom," checked");
  452.       
  453.    strcat(inputcom,">\n");
  454.    XmTextInsert(he->textarea,left,inputcom);
  455.    XmTextSetInsertionPosition(he->textarea,left+strlen(inputcom));
  456.    XtFree(inputcom);XtFree(size);XtFree(name);XtFree(maxl);
  457.    XtFree(value);
  458.    check = 0;
  459.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  460. }
  461.  
  462.  
  463. void
  464. form_radio(Widget w, XtPointer client_data, XtPointer call_data)
  465. {
  466.    HTMLED *he = (HTMLED *)client_data;
  467.    
  468.    Widget dialog,name_box,text_name,label_name;
  469.    Widget checked,label_input;
  470.  
  471.    XmString va = XmStringCreateSimple("Value :");
  472.    XmString na = XmStringCreateSimple("Name :");
  473.  
  474.    XmString label = get_label_input(w);
  475.    XmString clear = XmStringCreateSimple("Clear");
  476.    
  477.    dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0);
  478.    
  479.    XtVaSetValues(dialog,XmNselectionLabelString,va,
  480.          XmNapplyLabelString,clear,NULL);
  481.    XmStringFree(va);   XmStringFree(clear);
  482.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  483.    
  484.    label_name = XmCreateLabel(name_box,"label_name",NULL,0);
  485.    XtVaSetValues(label_name,XmNlabelString,na,NULL);
  486.    XmStringFree(na);   
  487.  
  488.    text_name = XmCreateText(name_box,"text_name",NULL,0);
  489.  
  490.    checked = XmCreateToggleButton(name_box,"Checked",NULL,0);
  491.    
  492.    label_input = XmCreateLabel(name_box,"label_input",NULL,0);
  493.    XtVaSetValues(label_input,XmNlabelString,label,NULL);
  494.    XmStringFree(label);
  495.  
  496.   XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET, 
  497.          XmNtopWidget, label_name,
  498.          XmNleftAttachment, XmATTACH_FORM, 
  499.          XmNcolumns,26,
  500.          NULL);
  501.    XtManageChild(text_name);
  502.    
  503.    XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET, 
  504.          XmNtopWidget, checked,
  505.          XmNleftAttachment, XmATTACH_FORM, 
  506.          NULL); 
  507.    XtManageChild(label_name);
  508.    
  509.    XtVaSetValues(checked, XmNtopAttachment, XmATTACH_WIDGET, 
  510.          XmNtopWidget,label_input,
  511.          XmNleftAttachment, XmATTACH_FORM,
  512.          NULL); 
  513.  
  514.    XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM, 
  515.          XmNleftAttachment, XmATTACH_FORM,
  516.          NULL); 
  517.  
  518.    XtManageChild(checked);
  519.    XtManageChild(label_input);
  520.  
  521.    XtManageChild(name_box);
  522.  
  523.    /* When the user types the Value, call ok_input_text()... */
  524.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
  525.  
  526.    /* If the user selects cancel, just detroy the dialog */
  527.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  528.  
  529.    /* Clear button is available */
  530.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  531.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  532.  
  533.    /* No help is available */
  534.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  535.  
  536.    /* Callback of Check button */
  537.    XtAddCallback(checked,XmNvalueChangedCallback,(XtCallbackProc)checked_input,NULL);
  538.  
  539.    XtManageChild(dialog);
  540.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  541.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  542.                    0,0,800,800,0,0);
  543. }
  544.  
  545. void
  546. form_reset(Widget w, XtPointer client_data, XtPointer call_data)
  547. {
  548.    HTMLED *he = (HTMLED *)client_data;
  549.    
  550.    Widget dialog,label_input;
  551.    XmString label = get_label_input(w);
  552.    XmString clear = XmStringCreateSimple("Clear");
  553.    XmString va = XmStringCreateSimple("Value :");
  554.  
  555.    dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0);
  556.    
  557.    XtVaSetValues(dialog,XmNselectionLabelString,va,
  558.          XmNapplyLabelString,clear,NULL);
  559.  
  560.    XmStringFree(va);   XmStringFree(clear);
  561.    
  562.    label_input = XmCreateLabel(dialog,"label_input",NULL,0);
  563.    XtVaSetValues(label_input,XmNlabelString,label,NULL);
  564.    XmStringFree(label);
  565.    XtManageChild(label_input);
  566.  
  567.   /* When the user types the Value, call ok_input_text()... */
  568.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
  569.  
  570.    /* If the user selects cancel, just detroy the dialog */
  571.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  572.  
  573.    /* Clear button is available */
  574.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  575.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  576.  
  577.    /* No help is available */
  578.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  579.  
  580.    XtManageChild(dialog);
  581.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  582.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  583.                    0,0,800,800,0,0);
  584. }
  585.  
  586. void
  587. form_select(Widget w, XtPointer client_data, XtPointer call_data)
  588. {
  589.    HTMLED *he = (HTMLED *)client_data;
  590.    
  591.    Widget dialog,name_box,text_size,label_size;
  592.    Widget multiple,label_select;
  593.  
  594.    XmString si = XmStringCreateSimple("Size :");
  595.    XmString na = XmStringCreateSimple("Name :");
  596.  
  597.   XmString label=XmStringCreateLtoR("Select Field\n",XmSTRING_DEFAULT_CHARSET);
  598.    XmString clear = XmStringCreateSimple("Clear");
  599.    
  600.    dialog = XmCreatePromptDialog(he->textarea,"Select_field",NULL,0);
  601.    
  602.    XtVaSetValues(dialog,XmNselectionLabelString,na,
  603.          XmNapplyLabelString,clear,NULL);
  604.    XmStringFree(na);   XmStringFree(clear);
  605.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  606.    
  607.    label_size = XmCreateLabel(name_box,"label_size",NULL,0);
  608.    XtVaSetValues(label_size,XmNlabelString,si,NULL);
  609.    XmStringFree(si);   
  610.  
  611.    text_size = XmCreateText(name_box,"text_size",NULL,0);
  612.  
  613.    multiple = XmCreateToggleButton(name_box,"Multiple",NULL,0);
  614.    
  615.    label_select = XmCreateLabel(name_box,"label_select",NULL,0);
  616.    XtVaSetValues(label_select,XmNlabelString,label,NULL);
  617.    XmStringFree(label);
  618.  
  619.   XtVaSetValues(text_size, XmNtopAttachment,XmATTACH_WIDGET, 
  620.          XmNtopWidget, label_size,
  621.          XmNleftAttachment, XmATTACH_FORM, 
  622.          XmNcolumns,12,
  623.          NULL);
  624.    XtManageChild(text_size);
  625.    
  626.    XtVaSetValues(label_size, XmNtopAttachment,XmATTACH_WIDGET, 
  627.          XmNtopWidget, multiple,
  628.          XmNleftAttachment, XmATTACH_FORM, 
  629.          NULL); 
  630.    XtManageChild(label_size);
  631.    
  632.    XtVaSetValues(multiple, XmNtopAttachment, XmATTACH_WIDGET, 
  633.          XmNtopWidget,label_select,
  634.          XmNleftAttachment, XmATTACH_FORM,
  635.          NULL); 
  636.  
  637.    XtVaSetValues(label_select, XmNtopAttachment, XmATTACH_FORM, 
  638.          XmNleftAttachment, XmATTACH_FORM,
  639.          NULL); 
  640.  
  641.    XtManageChild(multiple);
  642.    XtManageChild(label_select);
  643.  
  644.    XtManageChild(name_box);
  645.  
  646.    /* When the user types the Value, call ok_input_text()... */
  647.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_select,(XtPointer)he);
  648.  
  649.    /* If the user selects cancel, just detroy the dialog */
  650.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  651.  
  652.    /* Clear button is available */
  653.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  654.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  655.  
  656.    /* No help is available */
  657.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  658.  
  659.    /* Callback of Multiple button */
  660.    XtAddCallback(multiple,XmNvalueChangedCallback,(XtCallbackProc)multiple_select,NULL);
  661.  
  662.    /* verify if these fields are numbers */   
  663.    XtAddCallback(text_size,XmNmodifyVerifyCallback,
  664.          (XtCallbackProc)check_number, (XtPointer)5);
  665.  
  666.    XtManageChild(dialog);
  667.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  668.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  669.                    0,0,800,800,0,0);
  670. }
  671.  
  672.  
  673. void
  674. ok_select(Widget w, XtPointer client_data, XtPointer call_data)
  675. {
  676.    
  677.   XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
  678.   HTMLED *he = (HTMLED *)client_data;
  679.   XmTextPosition left=0,right=0;
  680.   int len,lsel = 0;
  681.   char *str, *name=NULL,*ssel = NULL;
  682.   Widget dialog = XtNameToWidget(XtParent(w),"Select_field");
  683.   Widget name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
  684.   Widget  text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL);
  685.   char *size = (text_size ? XmTextGetString(text_size) : NULL);
  686.   int lsize = (size ? strlen(size) : 0);
  687.  
  688.   he->last_command = FORM;
  689.   if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  690.   {
  691.      if(right<=left)
  692.     left = right = XmTextGetInsertionPosition(he->textarea);
  693.   }
  694.   else
  695.      left = right = XmTextGetInsertionPosition(he->textarea);
  696.   
  697.   if(left!=right)
  698.   {
  699.      ssel = XmTextGetSelection(he->textarea);
  700.      lsel = strlen(ssel);
  701.   }
  702.   if(cbs->value!=NULL)
  703.   {
  704.      XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&name);
  705.      len = strlen(name);
  706.      str = XtMalloc(len+40);
  707.   }
  708.    if(left!=right)
  709.    {
  710.       XmTextInsert(he->textarea,right,"\n</SELECT>");
  711.       sprintf(str,"\n<SELECT name=\"%s\"",name);
  712.       if(lsize != 0)
  713.       {
  714.      strcat(str," size=");
  715.      strcat(str,size);
  716.       }
  717.       if(multi!=0)
  718.      strcat(str," multiple");
  719.       strcat(str,">\n");
  720.       XmTextInsert(he->textarea,left,str);
  721.       XmTextSetInsertionPosition(he->textarea,left+strlen(str));
  722.       XtFree(str); 
  723.    }
  724.    else
  725.    {
  726.       XtFree(str);
  727.       str = XtMalloc(50);
  728.       sprintf(str,"\n<SELECT name=\"%s\"",name);
  729.       if(lsize != 0)
  730.       {
  731.      strcat(str," size=");
  732.      strcat(str,size);
  733.       }
  734.       if(multi!=0)
  735.      strcat(str," multiple");
  736.       
  737.       strcat(str,">\n\n</SELECT>");
  738.       XmTextInsert(he->textarea,left,str);
  739.       XtFree(str);
  740.       XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 10);
  741.    }
  742.  
  743.   XtFree(ssel);
  744.   multi=0;
  745.   XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  746. }
  747.  
  748. void
  749. form_option(Widget w, XtPointer client_data, XtPointer call_data)
  750. {
  751.    HTMLED *he = (HTMLED *)client_data;
  752.    
  753.    Widget dialog,name_box;
  754.    Widget selected,label_option;
  755.  
  756.    XmString va = XmStringCreateSimple("Value :");
  757.  
  758.   XmString label=XmStringCreateLtoR("Option Field\n",XmSTRING_DEFAULT_CHARSET);
  759.    XmString clear = XmStringCreateSimple("Clear");
  760.    
  761.    dialog = XmCreatePromptDialog(he->textarea,"Option_field",NULL,0);
  762.    
  763.    XtVaSetValues(dialog,XmNselectionLabelString,va,
  764.          XmNapplyLabelString,clear,NULL);
  765.    XmStringFree(va);   XmStringFree(clear);
  766.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  767.  
  768.    selected = XmCreateToggleButton(name_box,"Selected",NULL,0);
  769.    
  770.    label_option = XmCreateLabel(name_box,"label_option",NULL,0);
  771.    XtVaSetValues(label_option,XmNlabelString,label,NULL);
  772.    XmStringFree(label);
  773.  
  774.    XtVaSetValues(selected, XmNtopAttachment, XmATTACH_WIDGET, 
  775.          XmNtopWidget,label_option,
  776.          XmNleftAttachment, XmATTACH_FORM,
  777.          NULL); 
  778.  
  779.    XtVaSetValues(label_option, XmNtopAttachment, XmATTACH_FORM, 
  780.          XmNleftAttachment, XmATTACH_FORM,
  781.          NULL); 
  782.  
  783.    XtManageChild(selected);
  784.    XtManageChild(label_option);
  785.  
  786.    XtManageChild(name_box);
  787.  
  788.    /* When the user types the Value, call ok_input_text()... */
  789.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_option,(XtPointer)he); 
  790.  
  791.    /* If the user selects cancel, just detroy the dialog */
  792.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  793.  
  794.    /* Clear button is available */
  795.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  796.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  797.  
  798.    /* No help is available */
  799.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  800.  
  801.    /* Callback of Multiple button */
  802.    XtAddCallback(selected,XmNvalueChangedCallback,(XtCallbackProc)selected_check,NULL);
  803.  
  804.    XtManageChild(dialog);
  805.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  806.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  807.                    0,0,800,800,0,0);
  808. }
  809. void
  810. ok_option(Widget w, XtPointer client_data, XtPointer call_data)
  811. {
  812.    HTMLED *he = (HTMLED *)client_data;
  813.    XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
  814.    int lvalue=0;
  815.  
  816.    XmTextPosition left = XmTextGetInsertionPosition(he->textarea);
  817.    char *optioncom = NULL;   
  818.    char *value=NULL;
  819.  
  820.    if(cbs->value)
  821.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
  822.  
  823.    lvalue = (value ? strlen(value): 0);
  824.  
  825.    optioncom=XtMalloc(lvalue+30);
  826.  
  827.    he->last_command = OPTION;
  828.  
  829.    strcpy(optioncom,"<OPTION ");
  830.  
  831.    if(lvalue!=0)
  832.    {
  833.       strcat(optioncom," value=\"");
  834.       strcat(optioncom,value);
  835.       strcat(optioncom,"\"");
  836.    }
  837.    
  838.    if(selec!=0)
  839.       strcat(optioncom," selected");
  840.       
  841.    strcat(optioncom,"> ");
  842.    XmTextInsert(he->textarea,left,optioncom);
  843.    XmTextSetInsertionPosition(he->textarea,left+strlen(optioncom));
  844.    XtFree(optioncom);
  845.    XtFree(value);
  846.    selec = 0;
  847.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  848. }
  849.  
  850. void
  851. form_textarea(Widget w, XtPointer client_data, XtPointer call_data)
  852. {
  853.    HTMLED *he = (HTMLED *)client_data;
  854.    
  855.    Widget dialog,name_box;
  856.    Widget label_cols,text_cols,label_rows,text_rows,label_textarea;
  857.  
  858.    XmString va = XmStringCreateSimple("Name :");
  859.    XmString ro = XmStringCreateSimple("Rows :");
  860.    XmString cl = XmStringCreateSimple("Cols :        ");
  861.    XmString label =
  862.      XmStringCreateLtoR("Textarea Field\n",XmSTRING_DEFAULT_CHARSET);
  863.    XmString clear = XmStringCreateSimple("Clear");
  864.  
  865.    dialog = XmCreatePromptDialog(he->textarea,"Textarea_field",NULL,0);
  866.  
  867.    XtVaSetValues(dialog,XmNselectionLabelString,va,
  868.          XmNapplyLabelString,clear,NULL);
  869.    XmStringFree(va);XmStringFree(clear);
  870.  
  871.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  872.  
  873.    label_cols = XmCreateLabel(name_box,"label_cols",NULL,0);
  874.    XtVaSetValues(label_cols,XmNlabelString,cl,NULL);
  875.    XmStringFree(cl);
  876.  
  877.    text_cols = XmCreateText(name_box,"text_cols",NULL,0);
  878.  
  879.    label_rows = XmCreateLabel(name_box,"label_rows",NULL,0);
  880.    XtVaSetValues(label_rows,XmNlabelString,ro,NULL);
  881.    XmStringFree(ro);
  882.  
  883.    text_rows = XmCreateText(name_box,"text_rows",NULL,0);
  884.  
  885.    label_textarea = XmCreateLabel(name_box,"label_textarea",NULL,0);
  886.    XtVaSetValues(label_textarea,XmNlabelString,label,NULL);
  887.    XmStringFree(label);
  888.  
  889.    XtVaSetValues(text_cols, XmNtopAttachment, XmATTACH_WIDGET, 
  890.          XmNtopWidget,label_cols,
  891.          XmNleftAttachment, XmATTACH_FORM, 
  892.          XmNcolumns,12,
  893.          NULL);
  894.  
  895.    XtVaSetValues(label_cols, XmNtopAttachment, XmATTACH_WIDGET, 
  896.          XmNtopWidget,label_textarea,
  897.          XmNleftAttachment, XmATTACH_FORM,
  898.          NULL); 
  899.    XtVaSetValues(label_textarea, XmNtopAttachment, XmATTACH_FORM, 
  900.          XmNleftAttachment, XmATTACH_FORM,
  901.          NULL); 
  902.  
  903.    XtVaSetValues(text_rows, XmNtopAttachment, XmATTACH_WIDGET, 
  904.          XmNtopWidget,label_rows,
  905.          XmNleftAttachment, XmATTACH_WIDGET, 
  906.          XmNleftWidget, text_cols,
  907.          XmNcolumns,12,
  908.          NULL);
  909.  
  910.    XtVaSetValues(label_rows, XmNtopAttachment, XmATTACH_WIDGET,
  911.          XmNtopWidget,label_textarea,
  912.          XmNleftAttachment, XmATTACH_WIDGET,
  913.          XmNleftWidget, label_cols,
  914.          NULL);
  915.  
  916.    XtManageChild(text_cols);
  917.    XtManageChild(label_cols); 
  918.    XtManageChild(text_rows);
  919.    XtManageChild(label_rows);
  920.    XtManageChild(label_textarea);
  921.  
  922.    XtManageChild(name_box);
  923.   
  924.   /* When the user types the Value, call ok_input_text()... */
  925.   XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_textarea,(XtPointer)he);
  926.    
  927.    /* If the user selects cancel, just detroy the dialog */
  928.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  929.  
  930.    /* Clear button is available */
  931.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  932.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  933.  
  934.    /* No help is available */
  935.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  936.  
  937.    /* verify if these fields are numbers */   
  938.    XtAddCallback(text_cols,XmNmodifyVerifyCallback,
  939.          (XtCallbackProc)check_number, (XtPointer)5);
  940.    XtAddCallback(text_rows,XmNmodifyVerifyCallback,
  941.          (XtCallbackProc)check_number, (XtPointer)5);
  942.  
  943.    XtManageChild(dialog);
  944.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  945.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  946.                    0,0,800,800,0,0);
  947.  
  948. }
  949.  
  950. void
  951. ok_textarea(Widget w, XtPointer client_data, XtPointer call_data)
  952. {
  953.   XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
  954.   HTMLED *he = (HTMLED *)client_data;
  955.   XmTextPosition left=0,right=0;
  956.   int len,lsel = 0;
  957.   char *str, *name=NULL,*ssel = NULL;
  958.   Widget dialog = XtNameToWidget(XtParent(w),"Textarea_field");
  959.   Widget name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
  960.   Widget  text_cols = (name_box ? XtNameToWidget(name_box,"text_cols") : NULL);
  961.   Widget  text_rows = (name_box ? XtNameToWidget(name_box,"text_rows") : NULL);
  962.   char *cols = (text_cols ? XmTextGetString(text_cols) : NULL);
  963.   char *rows = (text_rows ? XmTextGetString(text_rows) : NULL);
  964.   int lrows = (rows ? strlen(rows) : 0);
  965.   int lcols = (cols ? strlen(cols) : 0);
  966.  
  967.   he->last_command = TEXTAREA;
  968.   if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  969.   {
  970.      if(right<=left)
  971.     left = right = XmTextGetInsertionPosition(he->textarea);
  972.   }
  973.   else
  974.      left = right = XmTextGetInsertionPosition(he->textarea);
  975.   
  976.   if(left!=right)
  977.   {
  978.      ssel = XmTextGetSelection(he->textarea);
  979.      lsel = strlen(ssel);
  980.   }
  981.   if(cbs->value!=NULL)
  982.   {
  983.      XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&name);
  984.      len = strlen(name);
  985.      str = XtMalloc(len+40);
  986.   }
  987.    if(left!=right)
  988.    {
  989.       XmTextInsert(he->textarea,right,"\n</TEXTAREA>");
  990.       sprintf(str,"\n<TEXTAREA name=\"%s\"",name);
  991.       if(lcols != 0)
  992.       {
  993.      strcat(str," cols=");
  994.      strcat(str,cols);
  995.       }
  996.       if(lrows != 0)
  997.       {
  998.      strcat(str," rows=");
  999.      strcat(str,rows);
  1000.       }
  1001.  
  1002.       strcat(str,">\n");
  1003.       XmTextInsert(he->textarea,left,str);
  1004.       XmTextSetInsertionPosition(he->textarea,left+strlen(str));
  1005.       XtFree(str); 
  1006.    }
  1007.    else
  1008.    {
  1009.       XtFree(str);
  1010.       str = XtMalloc(50);
  1011.       sprintf(str,"\n<TEXTAREA name=\"%s\"",name);
  1012.       if(lcols != 0)
  1013.       {
  1014.      strcat(str," cols=");
  1015.      strcat(str,cols);
  1016.       }
  1017.       if(lrows != 0)
  1018.       {
  1019.      strcat(str," rows=");
  1020.      strcat(str,rows);
  1021.       }
  1022.  
  1023.       
  1024.       strcat(str,">\n\n</TEXTAREA>");
  1025.       XmTextInsert(he->textarea,left,str);
  1026.       XtFree(str);
  1027.       XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 12);
  1028.    }
  1029.  
  1030.   XtFree(ssel);
  1031.   XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  1032. }
  1033.  
  1034.  
  1035. XmString
  1036. get_label_input(Widget w)
  1037. {
  1038.    XmString str;
  1039.    char typein[30];
  1040.    int i;
  1041.    
  1042.    strcpy(typein, "Input Type : ");
  1043.    for(i=0;type_menu[i].label != NULL;i++)
  1044.       if(!strcmp(XtName(w),type_menu[i].label))
  1045.       {
  1046.      strcat(typein,type_menu[i].label);
  1047.      strcat(typein,"\n");
  1048.      str = XmStringCreateLtoR(typein,XmSTRING_DEFAULT_CHARSET);
  1049.      ntype = i;
  1050.      return str;     
  1051.       }
  1052.    return str;
  1053. }
  1054.  
  1055. void
  1056. check_number(Widget text_w, XtPointer client_data, XtPointer call_data)
  1057. {
  1058.    char c;
  1059.    int ml = (int)client_data;
  1060.    int len = XmTextGetLastPosition(text_w);
  1061.    XmTextVerifyCallbackStruct *cbs =(XmTextVerifyCallbackStruct *)call_data;
  1062.    
  1063.    if(cbs->reason == XmCR_MOVING_INSERT_CURSOR)
  1064.    {
  1065.       if(cbs->newInsert != len)
  1066.      cbs->doit = False;
  1067.       return;
  1068.    }
  1069.    /* no backspacing, typing or stuffing in middle of string */
  1070.    if(cbs->currInsert < len)
  1071.    {
  1072.       cbs->doit = False;
  1073.       return;
  1074.    }
  1075.    if(cbs->text->length == 0)
  1076.       return;
  1077.    if(cbs->text->length > 1)
  1078.    {
  1079.       cbs->doit = False;
  1080.       return;
  1081.    }
  1082.    if(!isdigit(c=cbs->text->ptr[0]) || len >= ml)
  1083.    {
  1084.       cbs->doit = False;
  1085.       XBell(XtDisplay(text_w),100);
  1086.    }
  1087. }
  1088.       
  1089. void
  1090. checked_input(Widget w, XtPointer client_data, XtPointer call_data)
  1091. {
  1092.    if(check == 0)
  1093.       check = 1;
  1094.    else
  1095.       check = 0;
  1096. }
  1097. void
  1098. multiple_select(Widget w, XtPointer client_data, XtPointer call_data)
  1099. {
  1100.    if(multi == 0)
  1101.       multi = 1;
  1102.    else
  1103.       multi = 0;
  1104. }
  1105. void
  1106. selected_check(Widget w, XtPointer client_data, XtPointer call_data)
  1107. {
  1108.    if(selec == 0)
  1109.       selec = 1;
  1110.    else
  1111.       selec = 0;
  1112. }
  1113.